#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
const int maxn = 5e4 + 5; // 最大数组大小
const int maxq = 1e5 + 5; // 最大查询数量
int a[maxn]; // n: 数组大小, q: 查询数量, tail: 当前处理的数组尾部
ll c[maxn];                // 树状数组
unordered_map<int, int> m; // 存储每个元素最后出现的位置
struct query {
  int l, r, id; // 查询的左边界、右边界和ID
  ll ans;       // 查询结果
} Q[maxq];      // 查询数组

int n, q, tail;
// 比较函数，用于按右边界排序
bool cmp1(query x, query y) { return x.r < y.r; }
// 比较函数，用于按ID排序
bool cmp2(query x, query y) { return x.id < y.id; }

// 计算低位1的值
int lowbit(int x) { return x & -x; }

// 计算前缀和
ll sum(int x) {
  ll ret = 0;
  while (x) {
    ret += c[x];    // 累加当前索引的值
    x -= lowbit(x); // 移动到父节点
  }
  return ret; // 返回前缀和
}

// 更新树状数组
void modify(int x, int k) {
  while (x <= n) {
    c[x] += k;      // 更新当前索引的值
    x += lowbit(x); // 移动到下一个节点
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n; // 输入数组大小
  for (int i = 1; i <= n; ++i)
    cin >> a[i]; // 输入数组元素
  cin >> q;      // 输入查询数量
  for (int i = 1; i <= q; ++i) {
    Q[i].id = i;             // 记录查询ID
    cin >> Q[i].l >> Q[i].r; // 输入查询的左右边界
  }
  sort(Q + 1, Q + q + 1, cmp1); // 按右边界排序查询
  for (int i = 1; i <= q; ++i) {
    while (tail < Q[i].r) {           // 处理当前查询的右边界
      ++tail;                         // 移动尾部
      if (m[a[tail]])                 // 如果元素已经存在
        modify( m[a[tail]], -a[tail] ); // 从树状数组中移除旧值
      m[ a[tail] ] = tail;              // 更新元素的最新位置
      modify( tail, a[tail]);          // 将新值加入树状数组
    }
    Q[i].ans = sum(Q[i].r) - sum(Q[i].l - 1); // 计算查询结果
  }
  sort(Q + 1, Q + q + 1, cmp2); // 按ID排序结果
  for (int i = 1; i <= q; ++i)
    cout << Q[i].ans << '\n'; // 输出结果
  return 0;
}